package br.edu.universo.si.projeto2.infojob.client.apresentacao;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanEmpresaAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanEmpresaPerfil;
import br.edu.universo.si.projeto2.infojob.client.componentes.DateBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.NumberBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.comboboxes.SetorAtuacaoListBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ErrorDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.SuccessDialogBox;
import br.edu.universo.si.projeto2.infojob.client.util.Util;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

public class AEmpresaPerfil extends DockPanel{
	
	private FlexTable flexTable;
	
	private HorizontalPanel botoesPanel;
	
	private Button salvarBtn;
	private Button limparBtn;
	private SetorAtuacaoListBox setorAtuacaoListBox;
	private TextArea metasTxt;
	private NumberBox totalFuncionariosTxt;
	private DateBox fundacaoTxt;
	private TextArea historiaTxt;
	private NumberBox totalFiliaisTxt;
	private TextBox websiteTxt;
	
	private BeanEmpresaAssinante bEmpresaAssinante;
	private BeanEmpresaPerfil bEmpresaPerfil;
	
	public AEmpresaPerfil(BeanEmpresaAssinante bEmpresaAssinante)
	{
		
		this.bEmpresaAssinante = bEmpresaAssinante;

		inicializarComponentes();

		flexTable.setCellSpacing(5);

		// seta os tamanhos dos campos...
		setorAtuacaoListBox.setWidth("200px");
		metasTxt.setWidth("300px");
		metasTxt.setHeight("100px");
		totalFuncionariosTxt.setWidth("100px");
		fundacaoTxt.setWidth("100px");
		historiaTxt.setWidth("300px");
		historiaTxt.setHeight("100px");
		totalFiliaisTxt.setWidth("100px");
		websiteTxt.setWidth("300px");

		flexTable.setWidget(0, 0, new HTML("<b>CRIE UM PERFIL PARA SUA EMPRESA</b>"));
		flexTable.getFlexCellFormatter().setColSpan(0, 0, 2);
		flexTable.getFlexCellFormatter().setAlignment(0, 0, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_MIDDLE);

		flexTable.setWidget(1, 0, new HTML("Setor de atuação:"));
		flexTable.setWidget(1, 1, setorAtuacaoListBox);
		flexTable.getFlexCellFormatter().setAlignment(1, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);

		flexTable.setWidget(2, 0, new HTML("Metas:"));
		flexTable.setWidget(2, 1, metasTxt);
		flexTable.getFlexCellFormatter().setAlignment(2, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);

		flexTable.setWidget(3, 0, new HTML("Total de funcionários:"));
		flexTable.setWidget(3, 1, totalFuncionariosTxt);
		flexTable.getFlexCellFormatter().setAlignment(3, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);

		flexTable.setWidget(4, 0, new HTML("Data de fundação:"));
		flexTable.setWidget(4, 1, fundacaoTxt);
		flexTable.getFlexCellFormatter().setAlignment(4, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);

		flexTable.setWidget(5, 0, new HTML("História da empresa:"));
		flexTable.setWidget(5, 1, historiaTxt);
		flexTable.getFlexCellFormatter().setAlignment(5, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);

		flexTable.setWidget(6, 0, new HTML("Total de filiais: "));
		flexTable.setWidget(6, 1, totalFiliaisTxt);
		flexTable.getFlexCellFormatter().setAlignment(6, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);

		flexTable.setWidget(7, 0, new HTML("Website:"));
		flexTable.setWidget(7, 1, websiteTxt);
		flexTable.getFlexCellFormatter().setAlignment(7, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);

		botoesPanel.add(salvarBtn);
		botoesPanel.add(limparBtn);

		flexTable.setWidget(8, 0, botoesPanel);
		flexTable.getFlexCellFormatter().setColSpan(8, 0, 2);
		flexTable.getFlexCellFormatter().setAlignment(8, 0, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);

		AEmpresaPerfil.this.add(flexTable, DockPanel.CENTER);

		AsyncCallback<BeanEmpresaPerfil> callbackDadosEmpresaPerfil = new AsyncCallback<BeanEmpresaPerfil>()
		{
			public void onSuccess(BeanEmpresaPerfil bEmpresaPerfil)
			{	
				AEmpresaPerfil.this.bEmpresaPerfil = bEmpresaPerfil; 
				if(setorAtuacaoListBox.getCallback()){
				  setorAtuacaoListBox.setSelectedIndex(bEmpresaPerfil.getIdSetorAtuacao() == null ? 0 : bEmpresaPerfil.getIdSetorAtuacao());
				} else {
				  setorAtuacaoListBox.setIndice(bEmpresaPerfil.getIdSetorAtuacao());
				  setorAtuacaoListBox.atauliza();
				}
				metasTxt.setText(bEmpresaPerfil.getMetas() == null ? "" : bEmpresaPerfil.getMetas());
				totalFuncionariosTxt.setText(bEmpresaPerfil.getTotalFuncionarios() == null ? "" :  Integer.toString(bEmpresaPerfil.getTotalFuncionarios()));
				fundacaoTxt.setText(bEmpresaPerfil.getFundacao() == null ? "" : bEmpresaPerfil.getFundacao());
				historiaTxt.setText(bEmpresaPerfil.getHistoria() == null ? "" : bEmpresaPerfil.getHistoria());
				totalFiliaisTxt.setText(bEmpresaPerfil.getTotalFiliais() == null ? "" : Integer.toString(bEmpresaPerfil.getTotalFiliais()));
				websiteTxt.setText(bEmpresaPerfil.getWebsite() == null ? "" : bEmpresaPerfil.getWebsite());
			}

			public void onFailure(Throwable caught) 
			{
				AEmpresaPerfil.this.bEmpresaPerfil = null;
				ErrorDialogBox errorDialogBox = new ErrorDialogBox("Por favor, cadastre os dados do perfil");
				errorDialogBox.show();
				errorDialogBox.center();
			}
		};
		
		Util.getService().getEmpresaPerfil(AEmpresaPerfil.this.bEmpresaAssinante.getId(), callbackDadosEmpresaPerfil);
		
		
		salvarBtn.addClickListener(
				new ClickListener()
				{
					public void onClick(Widget sender)
					{
						BeanEmpresaPerfil bEmpresaPerfil = new BeanEmpresaPerfil();
						bEmpresaPerfil.setIdEmpresa(AEmpresaPerfil.this.bEmpresaAssinante.getId());
						bEmpresaPerfil.setIdSetorAtuacao((Integer.parseInt(setorAtuacaoListBox.getValue(setorAtuacaoListBox.getSelectedIndex()))));
						bEmpresaPerfil.setMetas(metasTxt.getText());
						bEmpresaPerfil.setTotalFuncionarios(Integer.parseInt(totalFuncionariosTxt.getText()));
						bEmpresaPerfil.setFundacao(fundacaoTxt.getText());
						bEmpresaPerfil.setHistoria(historiaTxt.getText());
						bEmpresaPerfil.setTotalFiliais(Integer.parseInt(totalFiliaisTxt.getText()));
						bEmpresaPerfil.setWebsite(websiteTxt.getText());

						AsyncCallback<Object> callback = new AsyncCallback<Object>()
						{
							public void onSuccess(Object result)
							{
								SuccessDialogBox successDialobBox = new SuccessDialogBox("Perfil cadastrado com sucesso.");
								successDialobBox.center();
								successDialobBox.show();
							};

							public void onFailure(Throwable caught)
							{
								ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao cadastrar Perfil de Empresa: " + caught.getMessage());
								errorDialogBox.center();
								errorDialogBox.show();
							};
						};

						// se todos os campos estiverem ok, invoca o RPC para cadastrar a Empresa no banco
						if (verificarCampos())
						{
							if(AEmpresaPerfil.this.bEmpresaPerfil == null)
								Util.getService().cadastrarEmpresaPerfil(bEmpresaPerfil, callback);
							else
								Util.getService().alterarEmpresaPerfil(bEmpresaPerfil, callback);
						}
					}
				}
		);
		
		limparBtn.addClickListener(
				new ClickListener()
				{
					public void onClick(Widget sender)
					{
						limparCampos();
					}
				}
		);
	}

	
	private void inicializarComponentes()
	{
		flexTable = new FlexTable();

		botoesPanel = new HorizontalPanel();
		botoesPanel.setSpacing(3);

		salvarBtn = new Button("Salvar");
		limparBtn = new Button("Limpar");

		setorAtuacaoListBox = new SetorAtuacaoListBox();
		metasTxt = new TextArea();
		totalFuncionariosTxt = new NumberBox();
		fundacaoTxt = new DateBox();
		historiaTxt = new TextArea();
		totalFiliaisTxt = new NumberBox();
		websiteTxt = new TextBox();
	}

	private boolean verificarCampos()
	{
		return true; // que validacao eh essa?
	}

	private void limparCampos()
	{
		setorAtuacaoListBox.setItemSelected(0, true);
		metasTxt.setText("");
		totalFuncionariosTxt.setText("");
		fundacaoTxt.setText("");
		historiaTxt.setText("");
		totalFiliaisTxt.setText("");
		websiteTxt.setText("");
	}

}
